/**
 * 
 */
package com.cplsystems.incidencias.vm.catalogos;

import org.zkoss.bind.BindUtils;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.GlobalCommand;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Messagebox;

import com.cplsystems.incidencias.app.utils.IncidenciasUtils;
import com.cplsystems.incidencias.business.EstadoCivil;
import com.cplsystems.incidencias.business.FormaPago;
import com.cplsystems.incidencias.business.Idiomas;
import com.cplsystems.incidencias.business.NivelAcademico;
import com.cplsystems.incidencias.business.Servicios;
import com.cplsystems.incidencias.business.TipoDocumentoCalidad;
import com.cplsystems.incidencias.business.TipoIncidencia;
import com.cplsystems.incidencias.business.TipoNomina;
import com.cplsystems.incidencias.vm.catalogos.utils.CatalogosVariables;

/**
 * @author César Palalía López (csr.plz@aisa-automation.com)
 * 
 */
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class CatalogosVM extends CatalogosVariables {

	private static final long serialVersionUID = 2277182983981355150L;

	@Init
	public void init() {
		super.init();
	}

	@Command
	@NotifyChange({ "estadoCivilSeleccionado" })
	public void prepareElementForEdition(@BindingParam("index") Integer index) {
		if (index != null) {
			estadoCivilSeleccionado = estadosCiviles.get(index);
		}
	}

	@Command
	@NotifyChange({ "estadosCiviles", "estadoCivilSeleccionado" })
	public void guardarEstadoCivil() {
		estadoCivilService.save(estadoCivilSeleccionado);
		resetEstadoCivilVariables();
		IncidenciasUtils.showMessage("¡Información persistida correctamente!",
				Clients.NOTIFICATION_TYPE_INFO, 1000);
	}

	@Command
	@NotifyChange({ "estadosCiviles", "estadoCivilSeleccionado" })
	public void nuevoRegistroEstadoCivil() {
		EstadoCivil nuevoEstadoCivil = new EstadoCivil();
		estadosCiviles.add(nuevoEstadoCivil);
		estadoCivilSeleccionado = nuevoEstadoCivil;
	}

	@Command
	public void removerRegistroEstadoCivil() {
		if (estadoCivilSeleccionado == null) {
			IncidenciasUtils.showMessage(
					"Seleccione el elemento que deséa remover de la lista",
					Clients.NOTIFICATION_TYPE_WARNING, 1000);
			return;
		} else {
			Messagebox.show("¿Está seguro de remover este elemento?, "
					+ "esta acción es irreversible", "Question", Messagebox.OK
					| Messagebox.CANCEL, Messagebox.QUESTION,
					new EventListener<Event>() {
						public void onEvent(Event event) throws Exception {
							if (((Integer) event.getData()).intValue() == Messagebox.OK) {
								if (estadoCivilSeleccionado.getIdEstadoCivil() != null) {
									estadosCiviles
											.remove(estadoCivilSeleccionado);
									estadoCivilService
											.delete(estadoCivilSeleccionado);
									resetEstadoCivilVariables();
									BindUtils
											.postGlobalCommand(
													null,
													null,
													"refreshVariablesEstadoCivil",
													null);
								}
							}
						}
					});
		}
	}

	private void resetEstadoCivilVariables() {
		estadoCivilSeleccionado = new EstadoCivil();
	}

	@NotifyChange({ "estadosCiviles", "estadoCivilSeleccionado" })
	@GlobalCommand
	public void refreshVariablesEstadoCivil() {

	}

	@NotifyChange({ "nivelesAcademicos", "nivelAcademicoSeleccionado" })
	@GlobalCommand
	public void refreshVariablesNivelAcademico() {

	}

	@NotifyChange({ "formaPagoSeleccionada", "formasPago" })
	@GlobalCommand
	public void refreshVariablesFormaPago() {

	}

	@NotifyChange({ "listaIdiomas", "idiomaSeleccionado" })
	@GlobalCommand
	public void refreshVariablesIdioma() {

	}

	@Command
	@NotifyChange({ "nivelesAcademicos", "nivelAcademicoSeleccionado" })
	public void guardarNivelAcademico() {
		nivelAcademicoService.save(nivelAcademicoSeleccionado);
		nivelAcademicoSeleccionado = new NivelAcademico();
		IncidenciasUtils.showMessage("¡Información persistida correctamente!",
				Clients.NOTIFICATION_TYPE_INFO, 1000);
	}

	@Command
	@NotifyChange({ "nivelesAcademicos", "nivelAcademicoSeleccionado" })
	public void nuevoNivelAcademico() {
		NivelAcademico nuevoNivelAcademico = new NivelAcademico();
		nivelesAcademicos.add(nuevoNivelAcademico);
		nivelAcademicoSeleccionado = nuevoNivelAcademico;
	}

	@Command
	public void removerNivelAcademico() {
		if (nivelAcademicoSeleccionado == null) {
			IncidenciasUtils.showMessage(
					"Seleccione el elemento que deséa remover de la lista",
					Clients.NOTIFICATION_TYPE_WARNING, 1000);
			return;
		} else {
			Messagebox.show("¿Está seguro de remover este elemento?, "
					+ "esta acción es irreversible", "Question", Messagebox.OK
					| Messagebox.CANCEL, Messagebox.QUESTION,
					new EventListener<Event>() {
						public void onEvent(Event event) throws Exception {
							if (((Integer) event.getData()).intValue() == Messagebox.OK) {
								if (nivelAcademicoSeleccionado
										.getIdniveAcademico() != null) {
									nivelesAcademicos
											.remove(nivelAcademicoSeleccionado);
									nivelAcademicoService
											.delete(nivelAcademicoSeleccionado);
									nivelAcademicoSeleccionado = new NivelAcademico();
									BindUtils.postGlobalCommand(null, null,
											"refreshVariablesNivelAcademico",
											null);
								}
							}
						}
					});
		}
	}

	@Command
	@NotifyChange({ "nivelAcademicoSeleccionado" })
	public void prepareNivelAcademicoForEdition(
			@BindingParam("index") Integer index) {
		if (index != null) {
			nivelAcademicoSeleccionado = nivelesAcademicos.get(index);
		} else {
			IncidenciasUtils.showMessage(
					"Por favor seleccione el elemento para su edición",
					Clients.NOTIFICATION_TYPE_WARNING, 1000);
		}
	}

	@Command
	@NotifyChange({ "formasPago", "formaPagoSeleccionada" })
	public void guardarFormaPago() {
		formaPagoService.save(formaPagoSeleccionada);
		formaPagoSeleccionada = new FormaPago();
		IncidenciasUtils.showMessage("¡Información persistida correctamente!",
				Clients.NOTIFICATION_TYPE_INFO, 1000);
	}

	@Command
	@NotifyChange({ "formasPago", "formaPagoSeleccionada" })
	public void nuevaFormaPago() {
		FormaPago nuevaFormaPago = new FormaPago();
		formasPago.add(nuevaFormaPago);
		formaPagoSeleccionada = nuevaFormaPago;
	}

	@Command
	@NotifyChange({ "formasPago", "formaPagoSeleccionada" })
	public void removerFormaPago() {
		if (formaPagoSeleccionada == null) {
			IncidenciasUtils.showMessage(
					"Seleccione el elemento que deséa remover de la lista",
					Clients.NOTIFICATION_TYPE_WARNING, 1000);
			return;
		} else {
			Messagebox.show("¿Está seguro de remover este elemento?, "
					+ "esta acción es irreversible", "Question", Messagebox.OK
					| Messagebox.CANCEL, Messagebox.QUESTION,
					new EventListener<Event>() {
						public void onEvent(Event event) throws Exception {
							if (((Integer) event.getData()).intValue() == Messagebox.OK) {
								if (formaPagoSeleccionada.getIdFormaPago() != null) {
									formasPago.remove(formaPagoSeleccionada);
									formaPagoService
											.delete(formaPagoSeleccionada);
									formaPagoSeleccionada = new FormaPago();
									BindUtils.postGlobalCommand(null, null,
											"refreshVariablesFormaPago", null);
								}
							}
						}
					});
		}

	}

	@Command
	@NotifyChange({ "formaPagoSeleccionada" })
	public void prepareFormaPagoForEdit(@BindingParam("index") Integer index) {
		if (index != null) {
			formaPagoSeleccionada = formasPago.get(index);
		} else {
			IncidenciasUtils.showMessage(
					"Por favor seleccione el elemento para su edición",
					Clients.NOTIFICATION_TYPE_WARNING, 1000);
		}
	}

	@Command
	@NotifyChange({ "listaIdiomas", "idiomaSeleccionado" })
	public void guardarIdioma() {
		idiomasService.save(idiomaSeleccionado);
		idiomaSeleccionado = new Idiomas();
		IncidenciasUtils.showMessage("¡Información persistida correctamente!",
				Clients.NOTIFICATION_TYPE_INFO, 1000);
	}

	@Command
	@NotifyChange({ "listaIdiomas", "idiomaSeleccionado" })
	public void nuevoIdioma() {
		Idiomas nuevoIdioma = new Idiomas();
		listaIdiomas.add(nuevoIdioma);
		idiomaSeleccionado = nuevoIdioma;
	}

	@Command
	@NotifyChange({ "listaIdiomas", "idiomaSeleccionado" })
	public void removerIdioma(@BindingParam("index") Integer index) {
		if (idiomaSeleccionado == null) {
			IncidenciasUtils.showMessage(
					"Seleccione el elemento que deséa remover de la lista",
					Clients.NOTIFICATION_TYPE_WARNING, 1000);
			return;
		} else {
			Messagebox.show("¿Está seguro de remover este elemento?, "
					+ "esta acción es irreversible", "Question", Messagebox.OK
					| Messagebox.CANCEL, Messagebox.QUESTION,
					new EventListener<Event>() {
						public void onEvent(Event event) throws Exception {
							if (((Integer) event.getData()).intValue() == Messagebox.OK) {
								if (idiomaSeleccionado.getIdIdiomas() != null) {
									listaIdiomas.remove(idiomaSeleccionado);
									idiomasService.delete(idiomaSeleccionado);
									idiomaSeleccionado = new Idiomas();
									BindUtils.postGlobalCommand(null, null,
											"refreshVariablesIdioma", null);
								}
							}
						}
					});
		}

	}

	@Command
	public void prepareIdiomaForEdition(@BindingParam("index") Integer index) {
		if (index != null) {
			idiomaSeleccionado = listaIdiomas.get(index);
		} else {
			IncidenciasUtils.showMessage(
					"Por favor seleccione el elemento para su edición",
					Clients.NOTIFICATION_TYPE_WARNING, 1000);
		}
	}

	@Command
	@NotifyChange({ "tiposDocumentos", "tipoDocumentoSeleccionado" })
	public void guardarDocumento() {
		for (TipoDocumentoCalidad documento : tiposDocumentos) {
			tipoDocumentoCalidadService.save(documento);
		}
		tipoDocumentoSeleccionado = new TipoDocumentoCalidad();
		IncidenciasUtils.showMessage("¡Información persistida correctamente!",
				Clients.NOTIFICATION_TYPE_INFO, 1000);
	}

	@Command
	@NotifyChange({ "tiposDocumentos", "tipoDocumentoSeleccionado" })
	public void nuevoDocumento() {
		TipoDocumentoCalidad tipoDocumentoCalidad = new TipoDocumentoCalidad();
		tiposDocumentos.add(tipoDocumentoCalidad);
		tipoDocumentoSeleccionado = tipoDocumentoCalidad;
	}

	@Command
	@NotifyChange({ "tiposDocumentos", "tipoDocumentoSeleccionado" })
	public void removerDocumento(@BindingParam("index") Integer index) {
		if (tipoDocumentoSeleccionado == null) {
			IncidenciasUtils.showMessage(
					"Seleccione el elemento que deséa remover de la lista",
					Clients.NOTIFICATION_TYPE_WARNING, 1000);
			return;
		} else {
			Messagebox.show("¿Está seguro de remover este elemento?, "
					+ "esta acción es irreversible", "Question", Messagebox.OK
					| Messagebox.CANCEL, Messagebox.QUESTION,
					new EventListener<Event>() {
						public void onEvent(Event event) throws Exception {
							if (((Integer) event.getData()).intValue() == Messagebox.OK) {
								if (tipoDocumentoSeleccionado
										.getIdTipoDocumentoCalidad() != null) {
									tiposDocumentos
											.remove(tipoDocumentoSeleccionado);
									tipoDocumentoCalidadService
											.delete(tipoDocumentoSeleccionado);
									tipoDocumentoSeleccionado = new TipoDocumentoCalidad();
									BindUtils.postGlobalCommand(null, null,
											"refreshVariablesDocumentos", null);
								}
							}
						}
					});
		}

	}

	@NotifyChange({ "tiposDocumentos", "tipoDocumentoSeleccionado" })
	@Command
	public void prepareDocumentoForEdition(@BindingParam("index") Integer index) {
		if (index != null) {
			tipoDocumentoSeleccionado = tiposDocumentos.get(index);
		}
	}

	@NotifyChange({ "tiposDocumentos", "tipoDocumentoSeleccionado" })
	@GlobalCommand
	public void refreshVariablesDocumentos() {

	}

	@Command
	@NotifyChange({ "tiposIncidencias", "tipoIncidenciaSeleccionada" })
	public void guardarTipoIncidencia() {
		for (TipoIncidencia tipoIncidencia : tiposIncidencias) {
			tipoIncidenciaService.save(tipoIncidencia);
		}
		tipoIncidenciaSeleccionada = new TipoIncidencia();
		IncidenciasUtils.showMessage("¡Información persistida correctamente!",
				Clients.NOTIFICATION_TYPE_INFO, 1000);
	}

	@Command
	@NotifyChange({ "tiposIncidencias", "tipoIncidenciaSeleccionada" })
	public void nuevoTipoIncidencia() {
		TipoIncidencia tipoIncidencia = new TipoIncidencia();
		tiposIncidencias.add(tipoIncidencia);
		tipoIncidenciaSeleccionada = tipoIncidencia;
	}

	@Command
	@NotifyChange({ "tiposIncidencias", "tipoIncidenciaSeleccionada" })
	public void removerTipoIncidencia(@BindingParam("index") Integer index) {
		if (tipoIncidenciaSeleccionada == null) {
			IncidenciasUtils.showMessage(
					"Seleccione el elemento que deséa remover de la lista",
					Clients.NOTIFICATION_TYPE_WARNING, 1000);
			return;
		} else {
			Messagebox.show("¿Está seguro de remover este elemento?, "
					+ "esta acción es irreversible", "Question", Messagebox.OK
					| Messagebox.CANCEL, Messagebox.QUESTION,
					new EventListener<Event>() {
						public void onEvent(Event event) throws Exception {
							if (((Integer) event.getData()).intValue() == Messagebox.OK) {
								if (tipoIncidenciaSeleccionada
										.getIdTipoIncidencia() != null) {
									tiposIncidencias
											.remove(tipoIncidenciaSeleccionada);
									tipoIncidenciaService
											.delete(tipoIncidenciaSeleccionada);
									tipoIncidenciaSeleccionada = new TipoIncidencia();
									BindUtils.postGlobalCommand(null, null,
											"refreshVariablesTiposIncidencias",
											null);
								}
							}
						}
					});
		}

	}

	@NotifyChange({ "tiposIncidencias", "tipoIncidenciaSeleccionada",
			"catalogoTiempoIncidenciaSeleccionada", "catalogoIMSSIncidencias",
			"catalogoIMSSIncidenciaSeleccionada", "catalogoTiempoIncidencias" })
	@Command
	public void prepareTipoIncidenciaForEdition(
			@BindingParam("index") Integer index) {
		if (index != null) {
			tipoIncidenciaSeleccionada = tiposIncidencias.get(index);
			catalogoTiempoIncidenciaSeleccionada = tipoIncidenciaSeleccionada
					.getTipo() != null
					&& !tipoIncidenciaSeleccionada.getTipo().isEmpty() ? tipoIncidenciaSeleccionada
					.getTipo() : "Seleccione";
			catalogoIMSSIncidenciaSeleccionada = tipoIncidenciaSeleccionada
					.getTipoParaIMMS() != null
					&& !tipoIncidenciaSeleccionada.getTipoParaIMMS().isEmpty() ? tipoIncidenciaSeleccionada
					.getTipoParaIMMS() : "Seleccione";
		}
	}

	@NotifyChange({ "tiposIncidencias", "tipoIncidenciaSeleccionada",
			"catalogoTiempoIncidenciaSeleccionada", "catalogoIMSSIncidencias",
			"catalogoIMSSIncidenciaSeleccionada", "catalogoTiempoIncidencias" })
	@GlobalCommand
	public void refreshVariablesTiposIncidencias() {
		catalogoIMSSIncidenciaSeleccionada = catalogoIMSSIncidencias.get(0);
		catalogoTiempoIncidenciaSeleccionada = catalogoTiempoIncidencias.get(0);
	}

	@NotifyChange({ "tiposIncidencias", "tipoIncidenciaSeleccionada" })
	@Command
	public void asignarTipoIncidenciaTiempo() {
		if (tipoIncidenciaSeleccionada != null) {
			if (!catalogoTiempoIncidenciaSeleccionada.equals("Seleccione")) {
				tipoIncidenciaSeleccionada
						.setTipo(catalogoTiempoIncidenciaSeleccionada);
			} else {
				IncidenciasUtils
						.showMessage(
								"La selección es inválida por favor intente nuevamente",
								Clients.NOTIFICATION_TYPE_WARNING, 2500);
			}
		}
	}

	@NotifyChange({ "tiposIncidencias", "tipoIncidenciaSeleccionada" })
	@Command
	public void asignarTipoIncidenciaIMSS() {
		if (tipoIncidenciaSeleccionada != null) {
			if (!catalogoIMSSIncidenciaSeleccionada.equals("Seleccione")) {
				tipoIncidenciaSeleccionada
						.setTipoParaIMMS(catalogoIMSSIncidenciaSeleccionada);
			} else {
				IncidenciasUtils
						.showMessage(
								"La selección es inválida por favor intente nuevamente",
								Clients.NOTIFICATION_TYPE_WARNING, 2500);
			}
		}
	}

	@Command
	@NotifyChange({ "tiposNominas", "tipoNominaSeleccionada" })
	public void guardarTipoNomina() {
		for (TipoNomina tipoNomina : tiposNominas) {
			tipoNominaService.save(tipoNomina);
		}
		tipoNominaSeleccionada = new TipoNomina();
		IncidenciasUtils.showMessage("¡Información persistida correctamente!",
				Clients.NOTIFICATION_TYPE_INFO, 1000);
	}

	@Command
	@NotifyChange({ "tiposNominas", "tipoNominaSeleccionada" })
	public void nuevoTipoNomina() {
		TipoNomina tipoNomina = new TipoNomina();
		tiposNominas.add(tipoNomina);
		tipoNominaSeleccionada = tipoNomina;
	}

	@Command
	@NotifyChange({ "tiposNominas", "tipoNominaSeleccionada" })
	public void removerTipoNomina(@BindingParam("index") Integer index) {
		if (tipoNominaSeleccionada == null) {
			IncidenciasUtils.showMessage(
					"Seleccione el elemento que deséa remover de la lista",
					Clients.NOTIFICATION_TYPE_WARNING, 2500);
			return;
		} else {
			Messagebox.show("¿Está seguro de remover este elemento?, "
					+ "esta acción es irreversible", "Question", Messagebox.OK
					| Messagebox.CANCEL, Messagebox.QUESTION,
					new EventListener<Event>() {
						public void onEvent(Event event) throws Exception {
							if (((Integer) event.getData()).intValue() == Messagebox.OK) {
								if (tipoNominaSeleccionada.getIdTipoNomina() != null) {
									tiposNominas.remove(tipoNominaSeleccionada);
									tipoNominaService
											.delete(tipoNominaSeleccionada);
									tipoNominaSeleccionada = new TipoNomina();
									BindUtils.postGlobalCommand(null, null,
											"refreshVariablesTiposNominas",
											null);
								}
							}
						}
					});
		}

	}

	@NotifyChange({ "tiposNominas", "tipoNominaSeleccionada" })
	@Command
	public void prepareTipoNominaForEdition(@BindingParam("index") Integer index) {
		if (index != null) {
			tipoNominaSeleccionada = tiposNominas.get(index);
		}
	}

	@NotifyChange({ "tiposNominas", "tipoNominaSeleccionada" })
	@GlobalCommand
	public void refreshVariablesTiposNominas() {

	}

	@Command
	@NotifyChange({ "servicios", "servicioSeleccionado" })
	public void guardarServicio() {
		for (Servicios srv : servicios) {
			servicioService.save(srv);
		}
		servicioSeleccionado = new Servicios();
		IncidenciasUtils.showMessage("¡Información persistida correctamente!",
				Clients.NOTIFICATION_TYPE_INFO, 1000);
	}

	@Command
	@NotifyChange({ "servicios", "servicioSeleccionado" })
	public void nuevoServicio() {
		Servicios servicio = new Servicios();
		servicios.add(servicio);
		servicioSeleccionado = servicio;
	}

	@Command
	@NotifyChange({ "servicios", "servicioSeleccionado" })
	public void removerServicios(@BindingParam("index") Integer index) {
		if (servicioSeleccionado == null) {
			IncidenciasUtils.showMessage(
					"Seleccione el elemento que deséa remover de la lista",
					Clients.NOTIFICATION_TYPE_WARNING, 2500);
			return;
		} else {
			Messagebox.show("¿Está seguro de remover este elemento?, "
					+ "esta acción es irreversible", "Question", Messagebox.OK
					| Messagebox.CANCEL, Messagebox.QUESTION,
					new EventListener<Event>() {
						public void onEvent(Event event) throws Exception {
							if (((Integer) event.getData()).intValue() == Messagebox.OK) {
								if (servicioSeleccionado.getIdServicio() != null) {
									servicios.remove(servicios);
									servicioService
											.delete(servicioSeleccionado);
									servicioSeleccionado = new Servicios();
									BindUtils.postGlobalCommand(null, null,
											"refreshVariablesServicios", null);
								}
							}
						}
					});
		}

	}

	@NotifyChange({ "servicios", "servicioSeleccionado" })
	@Command
	public void prepareServicioForEdition(@BindingParam("index") Integer index) {
		if (index != null) {
			servicioSeleccionado = servicios.get(index);
		}
	}

	@NotifyChange({ "servicios", "servicioSeleccionado" })
	@GlobalCommand
	public void refreshVariablesServicios() {

	}
}
